#include <cstring>
class Solution {
  public:
    int MoreThanHalfNum_Solution(vector<int>& numbers) {

        // 方法二
        // 如果把这些数字当做人种，一个数字和另外一个数字打了起来，同归于尽。最后剩下的是不是人数最多的那种人。
        // 这里要满足一个条件：某类人的数目一定要大于总人数的一半

        int candidate = numbers[0]; // 选择输入数组中第一个元素作为候选元素candidate

        int count = 1;  // 设置其出现次数为count=1

        for (int i = 1; i < numbers.size(); i++)    // 遍历数组
        {
            if (numbers[i] == candidate) // 遇到与candidate相同的元素，count+1
            {
                count++;
            } 
            else                        // 遇到与candidate不同的元素，count-1
            {
                count--;
            }
                
            if (count == 0) // 当count为0的时候，选择下一个元素为候选元素，并且置count=1
            {
                candidate = numbers[i + 1];
                count++;
            }
        }
        // 遍历到数组的最后，剩下的candidate就是要求的结果
        return candidate;
    

        // 方法一
        /*
        int num = 0;

        int *a = new int[10001];
        memset(a, 0, sizeof(int) * 10001);

        // 统计每个数出现的次数
        for(auto e : numbers)
        {
            a[e]++;
        }

        // 遍历数组，找出下标对应的元素，如果该元素大于numbers的一半，就记录到num里，然后break;
        for(int i = 0; i < 10001; i++)
        {
            if(a[i] > numbers.size() / 2)
            {
                num = i;
                break;
            }
        }

        return num;
        */
    }
};